package org.example.aaaatest.shijian;


import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;

/**
 * 时间戳时区转换工具类
 */
public class TimestampTimeZoneConverter {

    private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 将时间戳转换为目标时区的本地时间字符串
     *
     * @param timestamp 原始时间戳(毫秒)
     * @param targetTimeZone 目标时区
     * @return 目标时区的本地时间字符串
     */
    public static String convertToLocalTimeString(long timestamp, TimeZone targetTimeZone) {
        return convertToLocalTimeString(timestamp, targetTimeZone, DEFAULT_FORMATTER);
    }

    /**
     * 将时间戳转换为目标时区的本地时间字符串(自定义格式)
     *
     * @param timestamp 原始时间戳(毫秒)
     * @param targetTimeZone 目标时区
     * @param formatter 自定义格式
     * @return 目标时区的本地时间字符串
     */
    public static String convertToLocalTimeString(long timestamp, TimeZone targetTimeZone, DateTimeFormatter formatter) {
        ZonedDateTime zonedDateTime = Instant.ofEpochMilli(timestamp)
                .atZone(targetTimeZone.toZoneId());
        return zonedDateTime.format(formatter);
    }

    /**
     * 将目标时区的本地时间字符串转换为时间戳
     *
     * @param localTimeString 目标时区的本地时间字符串
     * @param sourceTimeZone 时间字符串对应的时区
     * @return 对应的时间戳(毫秒)
     */
    public static long convertLocalTimeToTimestamp(String localTimeString, TimeZone sourceTimeZone) {
        return convertLocalTimeToTimestamp(localTimeString, sourceTimeZone, DEFAULT_FORMATTER);
    }

    /**
     * 将目标时区的本地时间字符串转换为时间戳(自定义格式)
     *
     * @param localTimeString 目标时区的本地时间字符串
     * @param sourceTimeZone 时间字符串对应的时区
     * @param formatter 自定义格式
     * @return 对应的时间戳(毫秒)
     */
    public static long convertLocalTimeToTimestamp(String localTimeString, TimeZone sourceTimeZone, DateTimeFormatter formatter) {
        LocalDateTime localDateTime = LocalDateTime.parse(localTimeString, formatter);
        return localDateTime.atZone(sourceTimeZone.toZoneId())
                .toInstant()
                .toEpochMilli();
    }

    /**
     * 获取两个时区之间的时间偏移量(毫秒)
     *
     * @param fromTimeZone 原始时区
     * @param toTimeZone 目标时区
     * @return 时区偏移量(毫秒)
     */
    public static long getTimeZoneOffset(TimeZone fromTimeZone, TimeZone toTimeZone) {
        Instant now = Instant.now();
        return toTimeZone.getOffset(now.toEpochMilli()) - fromTimeZone.getOffset(now.toEpochMilli());
    }

    /**
     * 调整时间戳到目标时区的同一本地时间
     * (例如: 08:00 UTC → 08:00 America/New_York)
     *
     * @param timestamp 原始时间戳(毫秒)
     * @param originalTimeZone 原始时区
     * @param targetTimeZone 目标时区
     * @return 调整后的时间戳(毫秒)
     */
    public static long adjustToSameLocalTime(long timestamp, TimeZone originalTimeZone, TimeZone targetTimeZone) {
        // 获取原始时区的本地时间
        ZonedDateTime originalZoned = Instant.ofEpochMilli(timestamp)
                .atZone(originalTimeZone.toZoneId());

        // 使用相同的本地时间但不同的时区创建新时间
        LocalDateTime localDateTime = originalZoned.toLocalDateTime();
        ZonedDateTime targetZoned = localDateTime.atZone(targetTimeZone.toZoneId());

        return targetZoned.toInstant().toEpochMilli();
    }
}